#include <fstream>
#include <iostream>
#include "Controlador.h"

/**
 * \brief Construtor
 *
 * Inicia variáveis de uso geral
 */
Controlador::Controlador()
{
	DirDados = "./dados/";
	CarregaLogins();
}

/**
 * \brief Destrutor
 */
Controlador::~Controlador()
{

}

/**
 * \brief Método não implementado
 */
void Controlador::init()
{

}

/*!
 * \brief Lê arquivo de logins
 *
 * Carrega todos os usuários do sistema,
 * com suas respectivas senhas
 */
void Controlador::CarregaLogins()
{
	string nomecompleto = DirDados+"logins.txt";
	fstream arq(nomecompleto.c_str(), ios::in);
	if(!arq.is_open())
	{
		cerr << endl << "Erro ao abrir aquivo de login!";
		return;
    }

	string login, senha, linha;
	size_t pos;
	//Logins.clear(); // zera arvore, caso voce carregue novamente!
	while( !arq.eof() )
	{
		getline(arq,linha);
		pos = linha.find(';');
		login = linha.substr(0, pos);
		senha = linha.substr(pos+1);
		//Logins.insert(make_pair(login,senha)); //Insere par de valores login e senha!!!
	}
	arq.close();
}

/**
 * \brief Verifica se o login e a senha estao corretos
 *
 * Se o login estiver ok, carrega os interesses
 *
 * \param login Login do usuário
 * \param senha Senha do usuário
 *
 * \return Usuario Instância do objeto Usuario que foi logado
 */
Usuario Controlador::CheckLogin(string login, string senha)
{
	Usuario usu;
	vector<long> IDs;

	usu.SetLogin(login);
	usu.SetSenha(senha);
	usu.SetID(10);

	usu.CarregaInteresses();
	IDs = usu.CarregaLivrosDeInteresses();
	for(unsigned int i=0; i<IDs.size(); i++) {
		usu.AdicionaLivroDeInteresse(SelecionaLivro(IDs.at(i)));
	}

	UsuarioCorrente = usu;

	return UsuarioCorrente;
}

/**
 * \brief Retorna o valor do próximo ID disponível para um novo Livro
 *
 * \return long O Id disponível
 */
long Controlador::GetProximoLivroID()
{
	return 1l;
}

/**
 * \brief Adiciona um novo Livro
 *
 * \param novo_livro O Objeto do novo livro
 */
void Controlador::AdicionaLivro(Livro novo_livro)
{

}

/**
 * \brief Seleciona um livro a partir do ID
 *
 * \param id O ID do livro desejado
 * \return Livro O Objeto do livro
 */
Livro Controlador::SelecionaLivro(long id)
{
	return Livros.Seleciona(id);
}

/**
 * \brief Retorna usuario corrente
 *
 * \return Usuario Corrente
 */
Usuario *Controlador::GetUsuario()
{
	return &UsuarioCorrente;
}

/**
 * \brief Monta arvore de pesquisa
 *
 * Monta arvore binaria de pesquisa de acordo com o tipo de interesse
 *
 * \param tipo_interesse
 */
void Controlador::MontaPesquisa(int tipo_interesse)
{
	Livros.MontaPesquisa(tipo_interesse);
}

/**
 * \brief Realiza a pesquisa
 *
 * Pesquisa na arvore binaria de pesquisa
 *
 * \param valor
 */
vector<Livro> Controlador::PesquisaInteresses(string valor)
{
	return Livros.PesquisaInteresses(valor);
}

